package org.cloud.utils;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.context.annotation.Lazy;

public class SensitiveDataUtil {

    /**
     * 对指定的字符串中的敏感信息进行脱敏处理
     *
     * @param input       要处理的字符串
     * @param keywords    需要脱敏的关键字数组，例如 {"password", "validateCode"}
     * @param replacement 替换的字符串，如“****”
     * @return 脱敏后的字符串
     */
    /**
     * 对字符串中的敏感信息进行脱敏处理，只要字符串包含关键字就进行脱敏
     *
     * @param input       要处理的字符串（可以是JSON，也可以是其他格式）
     * @param keywords    需要脱敏的关键字数组，例如 {"password", "validateCode"}
     * @param replacement 替换的字符串，如"****"
     * @return 脱敏后的字符串
     */
    public String maskSensitiveData(String input, String[] keywords, String replacement) {
        if (input == null || keywords == null || replacement == null) {
            return input;
        }

        for (String keyword : keywords) {
            // 构建通用正则表达式，匹配以下几种情况：
            // 1. "key": "value" (JSON字符串中的键值对)
            // 2. "key": value (JSON字符串中的非字符串值)
            // 3. key=value (普通字符串中的键值对)
            // 4. key: value (普通字符串中的键值对)
            String regex = "(?i)\"" + keyword + "\"\\s*:\\s*\"(.*?)\"|" +    // JSON字符串中的键值对
                "\"" + keyword + "\"\\s*:\\s*([^\\s,\\}]+)|" +    // JSON中的非字符串值
                keyword + "\\s*=\\s*([^,\\s]+)|" +                // 普通字符串中的key=value
                keyword + "\\s*:\\s*([^,\\s]+)";                  // 普通字符串中的key: value

            Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(input);

            // 替换关键字后的内容为脱敏字符串
            input = matcher.replaceAll("\"" + keyword + "\": \"" + replacement + "\"");
        }

        return input;
    }

    public String maskSensitiveData(String input, String[] keywords) {
        return maskSensitiveData(input, keywords, "*");
    }

    public String maskSensitiveData(String input) {
        return maskSensitiveData(input, _SENSITIVE_KEYWORDS, "*");
    }

    private final String[] _INIT_SENSITIVE_KEYWORDS = {"password", "secret", "tradepassword", "key", "code", "value", "confirmValue",
        "validateCode", "validateCodeKey", "authorization", "codeKey", "codeValue"};
    private final String[] _SENSITIVE_KEYWORDS;

    @Lazy
    private SensitiveDataUtil() {
        String sensitiveConfig = EnvUtil.single().getEnv("system.sensitive.keyWords", "");
        if (StrUtil.isNotBlank(sensitiveConfig)) {
            _SENSITIVE_KEYWORDS = ArrayUtil.append(_INIT_SENSITIVE_KEYWORDS, sensitiveConfig.split(","));
        } else {
            _SENSITIVE_KEYWORDS = _INIT_SENSITIVE_KEYWORDS;
        }
    }

    public final static SensitiveDataUtil handler = new SensitiveDataUtil();
}
